#include "BSP/KEY/key.h"

void key_init(void) {
	GPIO_InitTypeDef gpio_init_struct;
	KEY_GPIO_CLK_ENABLE();
	WKUP_GPIO_CLK_ENABLE();
	
	gpio_init_struct.Pin = KEY0_GPIO_PIN;
	gpio_init_struct.Mode = GPIO_MODE_INPUT;
	gpio_init_struct.Pull = GPIO_PULLUP;
	gpio_init_struct.Speed = GPIO_SPEED_FREQ_HIGH;
	HAL_GPIO_Init(KEY0_GPIO_PORT, &gpio_init_struct);
	
	gpio_init_struct.Pin = KEY1_GPIO_PIN;
	gpio_init_struct.Mode = GPIO_MODE_INPUT;
	gpio_init_struct.Pull = GPIO_PULLUP;
	gpio_init_struct.Speed = GPIO_SPEED_FREQ_HIGH;
	HAL_GPIO_Init(KEY1_GPIO_PORT, &gpio_init_struct);
	
	gpio_init_struct.Pin = KEY2_GPIO_PIN;
	gpio_init_struct.Mode = GPIO_MODE_INPUT;
	gpio_init_struct.Pull = GPIO_PULLUP;
	gpio_init_struct.Speed = GPIO_SPEED_FREQ_HIGH;
	HAL_GPIO_Init(KEY2_GPIO_PORT, &gpio_init_struct);
	
	gpio_init_struct.Pin = WKUP_GPIO_PIN;
	gpio_init_struct.Mode = GPIO_MODE_INPUT;
	gpio_init_struct.Pull = GPIO_PULLDOWN;
	gpio_init_struct.Speed = GPIO_SPEED_FREQ_HIGH;
	HAL_GPIO_Init(WKUP_GPIO_PORT, &gpio_init_struct);
}

int key_scan(int mode) {
	static int key_up = 1;
	if (mode) key_up = 1;
	int key_val = 0;
	if (key_up && (!RKEY0() || !RKEY1() || !RKEY2() || RWKUP())) {
		key_up = 0;
		delay_ms(10);
		if (!RKEY0()) key_val = KEY0_PRES;
		if (!RKEY1()) key_val = KEY1_PRES;
		if (!RKEY2()) key_val = KEY2_PRES;
		if (RWKUP()) key_val = WKUP_PRES;
	} else if (!key_up && (RKEY0() || RKEY1() || RKEY2() || !RWKUP())) {
		key_up = 1;
	}
	return key_val;
}
